import matplotlib.pyplot as plt
from scipy import random
import numpy as np
%matplotlib inline
Escreva uma rotina para gerar caminhadas aleatórias de N passos em d (=1 ou 2) dimensões, com cada passo uniformemente distribuído no intervalo (-1/2, 1/2) em cada dimensão. (Primeiro, gere os passos como um array N x d e, então, faça uma soma cumulativa.)
def randomWalk(N, d):
"""
Gera uma caminhada aleatória de dimensão d e N passos
"""
steps = random.uniform(-0.5,0.5,(N,d))
walks = np.cumsum(steps, axis=0)
return walks
Faça um gráfico de $x_t$ por $t$ para poucas caminhadas de 10.000 passos.
for i in range(10):
plt.ylabel("Distância")
plt.xlabel("Passos")
plt.title("Caminhadas Aleatórias 1D - 10000 passos")
plt.plot(randomWalk(10000,1))
plt.show()
for i in range(10):
plt.ylabel("Distância")
plt.xlabel("Passos")
plt.title("Caminhadas Aleatórias 1D - 10000 passos")
plt.plot(randomWalk(10000,1))
plt.show()
for i in range(10):
plt.ylabel("Distância")
plt.xlabel("Passos")
plt.title("Caminhadas Aleatórias 1D - 10000 passos")
plt.plot(randomWalk(10000,1))
plt.show()
Comentário: apesar de que cada caminhada aleatória é única e distinta, quando fazemos várias, é possível ver certos padrões.
Se você multiplicar o número de passo por 100, a distância final da caminhada aumenta por cerca de 10 vezes?
for i in range(10):
plt.ylabel("Distância")
plt.xlabel("Passos")
plt.title("Caminhadas Aleatórias 1D - 10^6 passos")
plt.plot(randomWalk(10000*100,1))
plt.show()
for i in range(10):
plt.ylabel("Distância")
plt.xlabel("Passos")
plt.title("Caminhadas Aleatórias 1D - 10^6 passos")
plt.plot(randomWalk(10000*100,1))
plt.show()
for i in range(10):
plt.ylabel("Distância")
plt.xlabel("Passos")
plt.title("Caminhadas Aleatórias 1D - 10^6 passos")
plt.plot(randomWalk(10000*100,1))
plt.show()
Comentário: com apenas 10000 passos, a distância final era menor que 100, normalmente entre -60 e 60. Quando usamos 100 vezes mais passos, a distância final passou a ser entre normalmente -600 e 600. Isso reafirma o proposto no enunciado. Considerando também resultados posteriores, aumentar em $100$ vezes a quantidade de passos aumenta a distância aproximadamente em $\sqrt{100}=10$ vezes.
Faça um gráfico de x por y para poucas caminhadas aleatórias bidimensionais com N = 10, 1.000, e 100.000 (tente manter a razão de aspecto do gráfico XY em um.)
for N in [10,10000,100000]:
for i in range(10):
plt.title(f"Caminhadas Aleatórias 2D - {N} passos")
walks = randomWalk(N,2)
walks = np.array(walks).T
axs = plt.gca()
axs.set_aspect('equal', 'box')
plt.plot(walks[0], walks[1])
plt.show()